﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using EntidadesCompartidas;
using System.Data.SqlClient;
using System.Data;

using Persistencia.Properties;

namespace Persistencia.Datos
{
    public class PersCasa:Interfaces.IPersCasa
    {
        //Elementos que determinan el singleton
        //1- Atributo de Clase
        private static PersCasa _miPersistenciaCasa = null;
        //2- Constructor
        private PersCasa() { }
        //3- Metodo de Clase
        public static PersCasa GetCasa()
        {
            if (_miPersistenciaCasa == null)
            {
                _miPersistenciaCasa = new PersCasa();
            }
            return _miPersistenciaCasa;

        }
        /////////////////////////////////////////////////////////////////////////////////////////////




        #region Miembros de IPersCasa

        public EntidadesCompartidas.Casa BuscarCasa(int pId)
        {
            string _direccion;
            string _foto;
            int _idc;
            string _servicio;
            List<Usuario> _usuarios = new List<Usuario>();
            List<Plano> _planos = new List<Plano>();
            List<Luz> _luces = new List<Luz>();
            List<Sensor> _sensores = new List<Sensor>();
            List<Camara> _camaras = new List<Camara>();
            Casa _laCasa = null;

            SqlConnection _1conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            SqlDataReader _1lector;
            SqlTransaction _Tran = null;
            bool OK = false;

         try
            { 
                _1conexion.Open();
                _Tran = _1conexion.BeginTransaction();
              //  string consulta = "select * from Casas where idc = " + pId + " and EliminacionLogica = 1";
                string consulta;
                if(pId > 9999999)
                {
                    consulta = "select c.* from UsuarioXCasa uc, Usuarios u, Casas c where u.CI = uc.CI and c.Idc = uc.Idc and u.CI = " + pId + " and c.EliminacionLogica = 1"; ;
                }
                else
                {
                    consulta = "select * from Casas where idc = " + pId + " and EliminacionLogica = 1";
                }
                SqlCommand _1comando = new SqlCommand(consulta, _1conexion);
                _1comando.Transaction = _Tran;
                _1lector = _1comando.ExecuteReader();

                if (_1lector.Read())
                {
                    _direccion = (string)_1lector["Direccion"];
                    _foto = (string)_1lector["Foto"];
                    _idc = (int)_1lector["idc"];
                    _servicio = (string)_1lector["servicio"];
                    _usuarios = FabricaPersistencia.getPersUsuario().UsuariosXidCasa(_idc);
                    //---------------------- 2 conexion Planos------------------------------------------------
                    SqlConnection _2conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
                    _2conexion.Open();
                    string _2consulta = "select * from planos where Idc = " + _idc + " and EliminacionLogica = 1";
                    SqlCommand _2comando = new SqlCommand(_2consulta, _2conexion);
                    SqlDataReader _2lector = _2comando.ExecuteReader();
                    while (_2lector.Read())
                    {
                        int _idp = (int)_2lector["Idp"];
                        string _fotoP = (string)_2lector["Foto"];
                        //-------------------- COLECCIONES-------------------------------
                        //---------------------- 3 conexion luces------------------------------------------------
                        SqlConnection _3conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
                        _3conexion.Open();
                        string _3consulta = "select * from Luces where Idp = " + _idp + " and EliminacionLogica = 1";
                        SqlCommand _3comando = new SqlCommand(_3consulta, _3conexion);
                        SqlDataReader _3lector = _3comando.ExecuteReader();
                        while (_3lector.Read())
                        {
                            int _id = (int)_3lector["Id"];
                            bool _estado = (bool)_3lector["Estado"];
                            decimal _ejex = (decimal)_3lector["EjeX"];
                            decimal _ejey = (decimal)_3lector["EjeY"];
                            Luz _unaLuz = new Luz(_id, _estado, _ejex, _ejey);
                            _luces.Add(_unaLuz);
                            OK = true;
                        }
                        _3lector.Close();
                        _3conexion.Close();
                        //----------------------end 3 conexion ------------------------------------------------
                        //---------------------- 4 conexion sensores------------------------------------------------
                        SqlConnection _4conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
                        _4conexion.Open();
                        string _4consulta = "select * from Sensores where Idp = " + _idp + " and EliminacionLogica = 1";
                        SqlCommand _4comando = new SqlCommand(_4consulta, _4conexion);
                        SqlDataReader _4lector = _4comando.ExecuteReader();
                        while (_4lector.Read())
                        {
                            int _id = (int)_4lector["Id"];
                            bool _estado = (bool)_4lector["Estado"];
                            decimal _ejex = (decimal)_4lector["EjeX"];
                            decimal _ejey = (decimal)_4lector["EjeY"];
                            Sensor _unSensor = new Sensor(_id, _estado, _ejex, _ejey);
                            _sensores.Add(_unSensor);
                            OK = true;
                        }
                        _4lector.Close();
                        _4conexion.Close();
                        //----------------------end 4 conexion ------------------------------------------------
                        //---------------------- 5 conexion camaras------------------------------------------------
                        SqlConnection _5conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
                        _5conexion.Open();
                        string _5consulta = "select * from Camaras where Idp = " + _idp + " and EliminacionLogica = 1";
                        SqlCommand _5comando = new SqlCommand(_5consulta, _5conexion);
                        SqlDataReader _5lector = _5comando.ExecuteReader();
                        while (_5lector.Read())
                        {
                            string _id = (string)_5lector["DirRtsp"];
                            bool _estado = (bool)_5lector["Estado"];
                            decimal _ejex = (decimal)_5lector["EjeX"];
                            decimal _ejey = (decimal)_5lector["EjeY"];
                            Camara _unaCamara = new Camara(_id, _estado, _ejex, _ejey);
                            _camaras.Add(_unaCamara);
                            OK = true;
                        }
                        _5lector.Close();
                        _5conexion.Close();
                        //-------------------- COLECCIONES-------------------------------

                        Plano _unPlano = new Plano(_idp, _fotoP, null, _luces, _sensores, _camaras);
                        _planos.Add(_unPlano);
                        OK = true;
                    }
                    _2lector.Close();
                    _2conexion.Close();
                    //---------------------- 2 conexion Planos------------------------------------------------
                    _laCasa = new Casa(_idc, _foto, _direccion, _servicio, _usuarios, _planos);
                }
                _1lector.Close();
                if (OK)
                {
                    _Tran.Commit();
                }
                else
                {
                    _Tran.Rollback();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _1conexion.Close();
            }
            return _laCasa;
        }
        //-----------------------------------------------------------------------
        public List<EntidadesCompartidas.Casa> ListarCasas()
        {
            int _id;
            string _direccion;
            string _foto;
            
            string _servicio;

            List<Casa> _lista = new List<Casa>();

            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);

            string consulta = "select * from Casas where EliminacionLogica = 1";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);

            SqlDataReader _lector;

            try
            {
                _conexion.Open();
                _lector = _comando.ExecuteReader();
                while (_lector.Read())
                {
                    Casa _laCasa = new Casa();
                    _id = (int)_lector["Idc"];
                    _direccion = (string)_lector["Direccion"];
                    _foto = (string)_lector["Foto"];
                    
                    _servicio = (string)_lector["servicio"];
                    
                    _laCasa = new Casa(_id, _foto, _direccion,_servicio);

                    _lista.Add(_laCasa);
                }
                _lector.Close();

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }
            return _lista;
        }
        //-----------------------------------------------------------------------
        public int AltaCasa(EntidadesCompartidas.Casa pCasa)
        {
           SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
           SqlTransaction _miTran = null;
           string consulta = "insert into Casas(Direccion,Foto,Servicio,EliminacionLogica) values('" +
                                pCasa.Direccion + "','" +
                                pCasa.Foto + "','" +
                                pCasa.Servicio + "',1);Select @@IDENTITY as newId;";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);

            int _afectados = -1;

            try
            {
                _conexion.Open();
                _miTran = _conexion.BeginTransaction();
                _comando.Transaction = _miTran;
                decimal insertedID = (decimal)_comando.ExecuteScalar();
                _afectados = int.Parse(insertedID.ToString());
                foreach (Usuario _unUsu in pCasa.Usuarios)
                {
                    SqlCommand _2comando = null;
                    string _2consulta = "insert into UsuarioXCasa values(" + _unUsu.Ci + ", " + _afectados + ",1)";
                    _2comando = new SqlCommand(_2consulta, _conexion);
                    //-- tran --
                    _2comando.Transaction = _miTran;
                    _2comando.ExecuteNonQuery();
                }
                _miTran.Commit();
            }
            catch (Exception ex)
            {
                _miTran.Rollback();
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }
            
            return _afectados;
        }
        //-----------------------------------------------------------------------
        public int ModificarCasa(EntidadesCompartidas.Casa pCasa)
        {
            int _afectados = -1;        
            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "update Casas set Direccion= '" + pCasa.Direccion
                                + "', Foto= '" + pCasa.Foto
                                + "' where idc = " + pCasa.Id + " and EliminacionLogica = 1";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);
            try
            {
                _conexion.Open();
                _afectados = _comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }

            return _afectados;
        }
        //-----------------------------------------------------------------------
        public int EliminarCasa(EntidadesCompartidas.Casa pCasa)
        {
            int _afectados = -1;

            SqlConnection _1conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            SqlTransaction _miTran = null;
            bool _Ok = false;
            try
            {
                _1conexion.Open();
                //-- tran --
                _miTran = _1conexion.BeginTransaction();

                foreach (Plano pPlano in pCasa.Planos)
                {
                    //-----------1 modificar luces ------------------
                    foreach (Luz _unaLuz in pPlano.Luces)
                    {
                        SqlCommand _1comando = null;
                        string _1consulta = "update Luces set EliminacionLogica=" + 0 + " where Id = " + _unaLuz.Id + " and EliminacionLogica = 1";
                        _1comando = new SqlCommand(_1consulta, _1conexion);
                        //--   --
                        _1comando.Transaction = _miTran;
                        _afectados = _1comando.ExecuteNonQuery();
                        _Ok = (_afectados == 1);
                    }//-----------2 modificar sensores ------------------
                    foreach (Sensor _unSensor in pPlano.Sensores)
                    {
                        SqlCommand _2comando = null;
                        string _2consulta = "update Sensores set EliminacionLogica=" + 0 + " where Id = " + _unSensor.Id + " and EliminacionLogica = 1";
                        _2comando = new SqlCommand(_2consulta, _1conexion);
                        //-- tran --
                        _2comando.Transaction = _miTran;
                        _afectados = _2comando.ExecuteNonQuery();
                        _Ok = (_afectados == 1);
                    }//-----------3 modificar Camaras ------------------
                    foreach (Camara _unaCamara in pPlano.Camaras)
                    {
                        SqlCommand _3comando = null;
                        string _3consulta = "update Camaras set EliminacionLogica=" + 0 + " where Id = " + _unaCamara.DirRtsp + " and EliminacionLogica = 1";
                        _3comando = new SqlCommand(_3consulta, _1conexion);
                        //-- tran --
                        _3comando.Transaction = _miTran;
                        _afectados = _3comando.ExecuteNonQuery();
                        _Ok = (_afectados == 1);
                    }
                    if (pPlano.Luces.Count == 0 && pPlano.Sensores.Count == 0 && pPlano.Camaras.Count == 0)
                    {
                        _Ok = true;
                    }

                }
                
                //-----------3 ELIMINAR el plano ------------------
                foreach (Plano pPlano in pCasa.Planos)
                {
                    SqlCommand _4comando = null;
                    string _4consulta = "update Planos set EliminacionLogica=" + 0 + " where Idp = " + pPlano.Idp + " and EliminacionLogica = 1";
                    _4comando = new SqlCommand(_4consulta, _1conexion);
                    //-- tran --
                    _4comando.Transaction = _miTran;
                    _afectados = _4comando.ExecuteNonQuery();
                    _Ok = _Ok && (_afectados == 1);
                }
                if (pCasa.Planos.Count == 0)
                    _Ok = true;
                //-----------4 ELIMINAR la CASA------------------
                SqlCommand _5comando = null;
                string _5consulta = "update Casas set EliminacionLogica=" + 0 + " where Idc = " + pCasa.Id + " and EliminacionLogica = 1";
                _5comando = new SqlCommand(_5consulta, _1conexion);
                //-- tran --
                _5comando.Transaction = _miTran;
                _afectados = _5comando.ExecuteNonQuery();
                _Ok = _Ok && (_afectados == 1);

                if (_Ok)
                    _miTran.Commit();
                else
                    _miTran.Rollback();

            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                _1conexion.Close();
            }

            
            return _afectados;
        }

        #endregion


        public List<Casa> ListarCasas(Usuario usu)
        {
            int _id;
            string _direccion;
            string _foto;

            string _servicio;

            List<Casa> _lista = new List<Casa>();

            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);

            string consulta = "select c.* from Casas c, UsuarioXCasa uc where c.EliminacionLogica = 1 and uc.idc = c.idc and uc.CI = " + usu.Ci;
            SqlCommand _comando = new SqlCommand(consulta, _conexion);

            SqlDataReader _lector;

            try
            {
                _conexion.Open();
                _lector = _comando.ExecuteReader();
                while (_lector.Read())
                {
                    _id = (int)_lector["Idc"];
                    _direccion = (string)_lector["Direccion"];
                    _foto = (string)_lector["Foto"];
                    _servicio = (string)_lector["servicio"];
                    Casa _laCasa = new Casa(_id, _foto, _direccion, _servicio);
                    _lista.Add(_laCasa);
                }
                _lector.Close();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }
            return _lista;
        }
    }
}
